Docker 实战:Docker 搭建 LAMP、WordPress 镜像

作者 Marlous 日期 2019-03-12
Docker 实战:Docker 搭建 LAMP、WordPress 镜像

一 Docker 搭建 LAMP 环境

参考:
1、 Docker搭建LAMP环境
2、 Docker 基于centos7 的LAMP环境搭建
3、 玩转 docker 入门(10) 利用docker搭建LAMP(php5+mysql+apache2)集成环境

  1. 概述:
  • 两种方法进行搭建,一种是直接使用别人搭好的(从 Docker Hub 上拉,见本章参考 1),本笔记是直接使用别人搭好的用;第二种是自己从零搭建(见本章参考 2)。
  • 过程:Docker 中下载镜像 -> 设置数据卷(数据永久化)-> 映射运行一个容器 -> 其它操作(和使用虚拟机一样)
  1. 准备工作:
  • 拉镜像,下载 LAMP 镜像,去 Docker Hub 查看镜像信息避免坑 mattrayner/lamp 镜像

  • 创建好 docker 数据卷(数据持久化),运行容器:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    命令创建:
    docker volume create test_lamp_www # apache的web根目录 / 容器内:/var/www
    docker volume create test_lamp_apache_conf # apache的配置目录 / 容器内:/etc/apache2
    docker volume create test_lamp_mysql_conf # MySQL的配置目录 / 容器内:/etc/mysql
    docker volume create test_lamp_mysql_data # MySQL的数据目录 / 容器内:/var/lib/mysql

    映射命令(大概参考):
    docker run -it -p 80:80 -p 3306:3306 -v test_lamp_www:/var/www -v test_lamp_apache_conf:/etc/apache2 -v test_lamp_mysql_conf:/etc/mysql -v test_lamp_mysql_data:/var/lib/mysql --name testproject mattrayner/lamp /bin/bash
    # 解释:
    # docker run:运行一个 container,如果后面要绑定宿主主机的 0-1024 端口需要使用 sudo
    # -p port1:port2: 将宿主机的端口 port1 映射到容器中的 port2
    # -v volume:path: 将宿主机的 docker 卷映射到容器中的指定的路径
    # -t -i mattrayner/lamp /bin/bash:使用 mattrayner/lamp 生成容器,并打开 shell
  • Windows 环境中 DockerToolBox 目录挂载问题:
    DockerToolBox 的工作原理是,首先通过 VM 虚拟机创建一个 Linux 虚拟机,然后在虚拟机中安装 Docker。然后 VM 虚拟机通过共享文件夹的机制将宿主机文件挂载到虚拟机中,然后我们通过 -v 参数挂载时,: 前面的目录应该是 Linux 虚拟机中的共享文件夹的目录。

  • 补充,用图形工具查看容器相关信息:
    图中的 IP 是虚拟机的 IP,详见 Windows 环境中 DockerToolBox 目录挂载问题。一般是 127.0.0.1,本地访问。虚拟机问题导致的使用虚拟机 IP 更像是从公网访问。
    用图形工具查看容器相关信息

  • 补充:Windows 迁移本地 Docker 数据卷(Windows for Docker 软件安装的 Docker):
    参见:参考 1参考 2

  1. 对容器中的 Apache、MySQL 等进行启动、配置:
  • 每从镜像运行一个容器(添加完数据卷,数据卷数据会保留于宿主机)就相当于新建运行了一个虚拟机,并在上面运行了程序。

  • 启动容器内的 Apache、MySQL 服务,如下图是初次运行。然后对其进行配置,如数据库管理员密码等。记得所有脚本加执行权限 chmod +x xxx.sh 后再运行脚本!然后配置 MySQL 初始密码,命令 mysql -urootALTER USER 'root'@'localhost' IDENTIFIED BY '12345';
    初次运行

  • 宿主机浏览器访问 容器的公共 ip:port/phpmyadmin/ 来访问容器内的 phpmyadmin,图形化工具来使用其中的 MySQL。具体怎么配置记得去 Docker Hub 查看镜像信息避免坑 mattrayner/lamp 镜像

  • 补充:MySQL 密码的问题:Linux 解决下mysql 首次无法直接通过无密码登录问题

二 从零开始制作 LAMP 镜像

参考:
1、 Docker与Dockerfile极简入门文档
2、 Docker 基于centos7 的LAMP环境搭建
3、 如何在PHP7中安装mysql的扩展
4、 年终福利,PHP7+Apache2.4+MySQL5.6 源码编译安装,环境配置,搭建你自己的LAMP环境
5、 过程小结:从零开始构建 Docker LAMP 镜像

1 手动制作过程

Ubuntu 18.04.2;Apache 2.4.29;MySQL 5.7.25;PHP 7.2.15
Docker Hub:marlous/lamp

  1. 制作过程:
  • 从 Docker Hub 上拉一个 Ubuntu 镜像 docker pull ubuntu

  • 基于 Ubuntu 镜像,运行一个容器(最好指定好端口方便测试 docker run -it -p 80:80 -p 3306:3306 --name 准备的容器名 镜像名 /bin/bash),进入。

  • 安装相关服务:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    /*
    注意:安装的是最新版本的服务程序,PHP 7.2 和之前版本不太相同,所需要的插件模块也不太相同。
    网上很多是以前老版本的教程。本过程是目前最新版的安装过程。
    */

    /*
    换源
    cp /etc/apt/sources.list /etc/apt/sources_bak.list
    vi /etc/apt/sources.list
    把源拷贝进去
    // 注意,换源可能会导致很多包找不到!
    deb http://mirrors.aliyun.com/ubuntu/ xenial main
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial main
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main
    deb http://mirrors.aliyun.com/ubuntu/ xenial universe
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial universe
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
    deb http://mirrors.aliyun.com/ubuntu/ xenial-security main
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main
    deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security universe
    */

    // sudo apt-get -f install 修复包

    apt-get update
    apt-get install vim-gtk
    apt-get install apache2
    apt-get install php
    apt-get install mysql-server
    apt-get install phpmyadmin
    不配置 phpmyadmin

    /*
    service mysql restart
    service apache2 restart
    */

    无法重启 apache 服务:在 apache2.conf 中添加一行 ServerName 127.0.0.1:80

    // MySQL 服务启动报错的话(No directory, logging in with HOME=/)
    usermod -d /var/lib/mysql/ mysql#第一步
    ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock#第二步
    chown -R mysql:mysql /var/lib/mysql#第三步

    chmod 777 /var/www

    // 为查看 PHP 信息准备
    cd /var/www/html
    sudo vi info.php
    内容为
    <?php
    phpinfo();
    ?>

    // 之后运行镜像时,浏览器 127.0.0.1/info.php 查看环境是否搭建完成。

    进入 /etc/php/7.2/apache2/php.ini 去掉分号并改为 ;extension=mbstring.os

    service apache2 restart
    a2enmod rewrite // 启用 mod_rewrite 模块。
    apt-get install libapache2-mod-php // 没有的话注意 PHP 版本
    apt-get install php7.2-mbstring
    apt-get install php7.2-mysql
    apt-get install php7.2-gd

    // 在 /var/www 文件夹下建立链接。
    ln -s /usr/share/phpmyadmin /var/www/

    初始化 root 密码、创建一个用来访问数据库的用户。
    /*
    mysql -uroot、ALTER USER 'root'@'localhost' IDENTIFIED BY '12345';

    CREATE USER 'admin'@'localhost' IDENTIFIED BY '12345';
    GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
    quit
    */

    配置 phpmyadmin,配置 MySQL 帐号密码(admin,12345)。参考下面补充。// phpmyadmin/libraries/config.default.php

    /* 可选择
    apt install python-setuptools // 安装 supervisord 进程管理程序
    easy_install supervisor
    apt-get install supervisor
    配置 supervisord,参见下面配置方法
    supervisorctl reload
    */

    // 可选择配置服务开机自启。参见下面配置方法。
  • 制作成镜像,docker commit 容器名 起个镜像名

  • 从刚制作的镜像运行一个容器 docker run -it -p 80:80 -p 3306:3306 --name 容器名 镜像名 /bin/bash

  • 浏览器 127.0.0.1:80/phpmyadmin/127.0.0.1:80127.0.0.1:80/info.php 查看。(
    如果是 Windows 上的 DockerToolbox 安装的 Docker,则改为虚拟机的 IP 访问。)

  • 完成镜像的测试。

  • 可以上传镜像到 Docker Hub:docker push <hub-user>/<repo-name>:<tag>参考博文

  • 补充问题解决:ubuntu中supervisor的安装及配置MySQL在Ubuntu系统的三种自启动方法Ubuntu 16.04 安装 Apache, MySQL, PHP7 解决mbstring丢失phpmyadmin 配置

  1. 下次正式使用镜像:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    命令创建:
    docker volume create test_lamp_www # apache的web根目录 / 容器内:/var/www
    docker volume create test_lamp_apache_conf # apache的配置目录 / 容器内:/etc/apache2
    docker volume create test_lamp_mysql_conf # MySQL的配置目录 / 容器内:/etc/mysql
    docker volume create test_lamp_mysql_data # MySQL的数据目录 / 容器内:/var/lib/mysql

    映射命令(大概参考):
    docker run -it -p 80:80 -p 3306:3306 -v test_lamp_www:/var/www -v test_lamp_apache_conf:/etc/apache2 -v test_lamp_mysql_conf:/etc/mysql -v test_lamp_mysql_data:/var/lib/mysql --name 容器名 镜像名 /bin/bash
    # 解释:
    # docker run:运行一个 container,如果后面要绑定宿主主机的 0-1024 端口需要使用 sudo
    # -p port1:port2: 将宿主机的端口 port1 映射到容器中的 port2
    # -v volume:path: 将宿主机的 docker 卷映射到容器中的指定的路径
    # -t -i [镜像名] /bin/bash:使用 [镜像名] 生成容器,并打开 shell

    service apache2 start
    service mysql start

2 使用 Dockerfile 制作镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# LAMP docker image
FROM ubuntu
MAINTAINER Marlous "goonecat@foxmail.com"

RUN apt-get update && apt-get install vim-gtk && apt-get install apache2 && apt-get install php && apt-get install mysql-server && apt-get install phpmyadmin

# MySQL 服务启动报错的话(No directory, logging in with HOME=/)
RUN usermod -d /var/lib/mysql/ mysql && ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock && chown -R mysql:mysql /var/lib/mysql && chmod 777 /var/www

RUN apt-get install libapache2-mod-php && apt-get install php7.2-mbstring && apt-get install php7.2-mysql && apt-get install php7.2-gd && ln -s /usr/share/phpmyadmin /var/www/

RUN apt install python-setuptools && apt-get install supervisor

EXPOSE 80 3306
1
2
3
4
5
6
7
8
9
/*
使用 build 命令构建镜像:

创建文件夹;
编写 Dockerfile;
build 命令构建。
*/

docker build -t lamp_auto
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
对制作好的镜像运行容器后配置,可以配置后再做成镜像
*/

# 无法重启 apache 服务:在 apache2.conf 中添加一行 ServerName 127.0.0.1:80

# 为查看 PHP 信息准备
cd /var/www/html #第一步
sudo vi info.php #第二步
内容为 <?php phpinfo(); ?> #第三步

进入 /etc/php/7.2/apache2/php.ini 去掉分号并改为 ;extension=mbstring.os
service apache2 restart
a2enmod rewrite // 启用 mod_rewrite 模块。

mysql -uroot、ALTER USER 'root'@'localhost' IDENTIFIED BY '12345';
CREATE USER 'admin'@'localhost' IDENTIFIED BY '12345';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;

配置 phpmyadmin,配置 MySQL 帐号密码(admin,12345)。// phpmyadmin/libraries/config.default.php

3 制作运行使用的 docker-compose

  1. 使用 docker-compose up -d 命令从制作好的镜像运行一个容器:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    /*
    docker-compose.yml

    */

    lamp_auto:
    image: 'lamp_auto'
    restart: always
    hostname: 'lamp_auto'
    ports:
    - '3306:3306'
    - '80:80'
    volumes:
    - 'docker volume create test_lamp_www:/var/www'
    - 'docker volume create test_lamp_apache_conf:/etc/apache2'
    - 'docker volume create test_lamp_mysql_conf:/etc/mysql'
    - 'docker volume create test_lamp_mysql_data:/var/lib/mysql'

二 制作 WordPress 镜像

在上面 marlous/lamp 镜像基础上制作。
参考我的博文 《使用 WordPress 在云服务器快速建站》

Ubuntu 18.04.2;Apache 2.4.29;MySQL 5.7.25;PHP 7.2.15;WordPress 5.11
Docker Hub:marlous/wordpress

  1. 制作过程:
  • 基于 marlous/lamp 镜像运行容器,docker run -it -p 80:80 -p 3306:3306 --name 准备的容器名 镜像名 /bin/bash

  • 开启 Apache2、MySQL 服务。

  • 创建 WordPress 的数据库:

    1
    2
    3
    4
    5
    6
    7
    8
    mysql -u admin -p12345

    CREATE DATABASE WordPress; // WordPress 作为数据库名字。
    GRANT ALL PRIVILEGES ON WordPress.* TO "admin"@"localhost" IDENTIFIED BY "12345";

    FLUSH PRIVILEGES;

    EXIT
  • 下载 WordPress:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    apt-get install wget

    cd /tmp

    wget https://cn.wordpress.org/latest-zh_CN.tar.gz

    tar -xvzf latest-zh_CN.tar.gz

    mv html html_bak // www 目录下
    cp -Rf /tmp/wordpress/* /var/www/html
  • 将复制过去的文件中的 wp-config-sample.php 重命名为 wp-config.php。mv wp-config-sample.php wp-config.php

  • 配置 wp-config.php 文件,设置用户名密码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    DB_NAME 
    在第二步中为WordPress创建的数据库名称
    DB_USER
    在第二步中创建的WordPress用户名
    DB_PASSWORD
    第二步中为WordPress用户名设定的密码
    DB_HOST
    第二步中设定的hostname(通常是localhost,但总有例外;参见编辑wp-config.php文件中的“可能的DB_HOST值)。
    DB_CHARSET
    数据库字符串,通常不可更改(参见zh-cn:编辑wp-config.php)。
    DB_COLLATE
    留为空白的数据库排序
  • 制作成镜像,docker commit 容器名 起个镜像名

  • 从刚制作的镜像运行一个容器 docker run -it -p 80:80 -p 3306:3306 --name 容器名 镜像名 /bin/bash

  • 本地浏览器访问,通过安装脚本安装:
    放在 www 根目录下的 html 里的,http://example.com/wp-admin/install.php (本地用 127.0.0.1/wp-admin/install.php)。/放在 www 根目录下的 html 里的子目录的,http://example.com/blog/wp-admin/install.php

  • 出现安装界面,完成镜像的测试。

  • 可以上传镜像到 Docker Hub:docker push <hub-user>/<repo-name>:<tag>参考博文

  1. 下次正式使用镜像:
  • 运行容器进入:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    命令创建:
    docker volume create test_wordpress_wp_config # wordpress的配置目录 / 容器内:/var/www/html/
    docker volume create test_wordpress_apache_conf # apache的配置目录 / 容器内:/etc/apache2
    docker volume create test_wordpress_mysql_conf # MySQL的配置目录 / 容器内:/etc/mysql
    docker volume create test_wordpress_mysql_data # MySQL的数据目录 / 容器内:/var/lib/mysql

    映射命令(大概参考):
    docker run -it -p 80:80 -p 3306:3306 -v test_wordpress_wp_config:/var/www/html/ -v test_wordpress_apache_conf:/etc/apache2 -v test_wordpress_mysql_conf:/etc/mysql -v test_wordpress_mysql_data:/var/lib/mysql --name 容器名 镜像名 /bin/bash
    # 解释:
    # docker run:运行一个 container,如果后面要绑定宿主主机的 0-1024 端口需要使用 sudo
    # -p port1:port2: 将宿主机的端口 port1 映射到容器中的 port2
    # -v volume:path: 将宿主机的 docker 卷映射到容器中的指定的路径
    # -t -i [镜像名] /bin/bash:使用 [镜像名] 生成容器,并打开 shell

    service apache2 start
    service mysql start
  • 安装:
    本地(部署的服务器,远程则服务器名:80/wp-admin/install.php)浏览器访问,通过安装脚本安装:
    放在 www 根目录下的 html 里的,http://example.com/wp-admin/install.php (本地用 127.0.0.1/wp-admin/install.php)。/放在 www 根目录下的 html 里的子目录的,http://example.com/blog/wp-admin/install.php